package com.opcode.costa.ui.menu.addorder;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.TreeMap;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.opcode.costa.R;
import com.opcode.costa.ui.dialogs.FoodDetailDialogFragment;
import com.opcode.costa.ui.dialogs.FoodSelectingDialogFragment;
import com.opcode.costa.ui.menu.MenuOptionsActivity;
import com.opcode.nebulamobil.base.activities.FragmentActivityBase;
import com.opcode.nebulamobil.base.activities.MultiFragmentActivityBase;
import com.opcode.nebulamobil.base.components.ButtonBase;
import com.opcode.nebulamobil.base.components.LinearLayoutBase;
import com.opcode.nebulamobil.base.components.ListViewBase;
import com.opcode.nebulamobil.base.components.TextViewBase;
import com.opcode.nebulamobil.base.fragments.ResponsiveFragmentBase;
import com.opcode.nebulamobil.base.fragments.dialogfragments.OneButtonDialogFragmentBase;
import com.opcode.nebulamobil.base.fragments.dialogfragments.RoundedProgressDialogBase;
import com.opcode.nebulamobil.base.interfaces.OnButtonBaseClickListener;
import com.opcode.nebulamobil.base.interfaces.OnFoodDetailSelectListener;
import com.opcode.nebulamobil.base.interfaces.SelectedFoodListener;
import com.opcode.nebulamobil.information.ApplicationInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus.ConnectionStatusInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.FoodDataForm;
import com.opcode.nebulamobil.information.requests.costarequests.OrderRequest;
import com.opcode.nebulamobil.information.requests.costarequests.OrderedFoodListReq;
import com.opcode.nebulamobil.information.requests.costarequests.PrintReq;
import com.opcode.nebulamobil.information.responses.JSONResponse;
import com.opcode.nebulamobil.information.responses.costaresponses.FoodListResp;
import com.opcode.nebulamobil.information.responses.costaresponses.OrderResponse;
import com.opcode.nebulamobil.information.responses.costaresponses.OrderedFoodListResp;
import com.opcode.nebulamobil.information.responses.costaresponses.PrintResp;
import com.opcode.nebulamobil.utility.JsonConverter;
import com.opcode.nebulamobil.utility.STSLog;
import com.opcode.nebulamobil.utility.UniqueIdCreator;

/**
 * 
 * @author Okan ERDOĞAN
 * 
 *         8 Ağu 2014
 */
public class AddOrderStepTwoFragment extends ResponsiveFragmentBase implements SelectedFoodListener {

	/*
	 * Bu bölümde sınıf içerisinde kullanacağımız nesne referansları tanımlandı.
	 */
	private View vi;

	/*
	 * Sipariş ekleme ekranında kullanıcıya yemeklerini seçebilmeleri için
	 * sunulacak olan listview objelerine ait nesne referanslarıdır.
	 */
	private ListViewBase selectedFoodsListView, oldOrderedFoodsListview; // Eklenen yemekleri ve önceden siparişi verilen yemekleri göstermek için kullanılan listview'lardır.

	/*
	 * Yemek seçimi yapıldıktan sonra kullanıcıya seçili yemekleri gösteren
	 * listeye ait adapter nesnesine ait referanstır.
	 */
	private FoodListAfterAdapter selectedFoodsListAfterAdapter;

	/*
	 * Daha önceden siparişi verilen yemekleri gösteren listview'a ait adapter
	 * nesne referansıdır.
	 */
	private FoodListOldOrderedAdapter oldOrderedFoodsListAdapter;

	/*
	 * Yemek seçimi listview'unda gösterilecek olan yemeklerin listesini tutan
	 * arraylist nesne referanslarıdır.
	 */
	private ArrayList<FoodDataForm> demoMainFoodArray, demoSoupArray,demoDrinksArray, demoDessertsArray;

	/*
	 * Yemek seçiminin yapıldığı ve seçimden sonraki ekranı göstermek için
	 * kullanılacak olan linearlayout nesneleridir.
	 */
	private LinearLayoutBase afterLinearlayout, beforeLinearlayout;

	/*
	 * Yemek seçim işlemini tamamlamak ve sipariş ekleme işlemini onaylamak için
	 * kullanılacak olan buttonlardır.
	 */
	private ButtonBase foodChoosingOkButton, confirmButton;

	/*
	 * Yemeklerin ait oldukları kategorilere tıklayarak ilgili kategorinin
	 * açılmasını sağlayan buttonlardır.
	 */
	private ButtonBase mainFoodHeaderButton, soupHeaderButton,drinksHeaderButton, dessertHeaderButton;

	/*
	 * Eski siparişleri göstermek,hesap almak ve sipariş eklemek için gerekli
	 * button nesneleridir.
	 */
	private ButtonBase oldOrdersTabButton, addOrderTabButton,foodAccountingConfirmButton;

	/*
	 * Eski siparişlerin gösterildiği linearlayout nesne referansıdır.
	 */
	private LinearLayoutBase oldOrdersLinearlayout;

	/*
	 * Sipariş eklemek için kullanılacak olan ekranın layout nesne referansıdır.
	 */
	private LinearLayoutBase addOrderLinearLayout;

	/*
	 * Seçimi yapılmış olan yemeklerin kendi kategorilerine göre tutulduğu
	 * arraylistlerdir.
	 */
	private ArrayList<FoodDataForm> foodsSelectedList, mainFoodSelectedList,soupSelectedList, drinksSelectedList, dessertsSelectedList;
	
	private RoundedProgressDialogBase roundedProgressDialogBase;

	/*
	 * Seçili masaya ait request objesidir. Bu nesne ilk sipariş
	 * oluşturulduğunda üretildi. Daha sonra statik yapı içerisinde tutuldu.
	 * Yeni bir sipariş olduğunda da aynı nesne üzerinde eklemeler yapıldı.
	 */
	private OrderRequest orderRequest;

	private FoodListResp foodListResp;

	private OrderedFoodListResp orderedFoodListResp;

	private PrintResp printResp;

	private Handler myHandler = null;
	private Runnable myRunnable = null;

	private TextView totalAccountTextView;
	private double totalPrice = 0.00;

	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		this.vi = inflater.inflate(R.layout.add_order_step_two_fragment,container, false);


		this.myHandler = new Handler();

		/*
		 * Layout dosyasında oluşturulmuş olan görsel öğeler bu bölümde
		 * referanslara atanıyor.
		 */
		this.beforeLinearlayout = (LinearLayoutBase) this.vi.findViewById(R.id.food_choosing_before_layout);
		this.afterLinearlayout = (LinearLayoutBase) this.vi.findViewById(R.id.food_choosing_after_layout);
		this.selectedFoodsListView = (ListViewBase) this.vi.findViewById(R.id.selected_foods_after_listview);
		this.foodChoosingOkButton = (ButtonBase) this.vi.findViewById(R.id.food_choosing_ok_button);
		this.confirmButton = (ButtonBase) this.vi.findViewById(R.id.food_choosing_confirm_button);
		this.totalAccountTextView = (TextView) this.vi.findViewById(R.id.total_account_textView);

		this.oldOrderedFoodsListview = (ListViewBase) this.vi.findViewById(R.id.old_ordered_foods_listview);

		/*
		 * Yemek kategorilerine göre seçimi yapılmış yemekleri tutması için
		 * arraylist nesneleri oluşturuluyor.
		 */
		this.mainFoodSelectedList = new ArrayList<FoodDataForm>();
		this.soupSelectedList = new ArrayList<FoodDataForm>();
		this.drinksSelectedList = new ArrayList<FoodDataForm>();
		this.dessertsSelectedList = new ArrayList<FoodDataForm>();
		this.foodsSelectedList = new ArrayList<FoodDataForm>();

		/*
		 * Sipariş eklemek ve önceden verilen siparişleri görebilmek için bu
		 * nesneye ihtiyaç duyacağız. Bu nesne ilk olarak Yeni siparişin ilk
		 * adımında üretildi. Daha sonra ApplicationInfo class'ında statik bir
		 * referansta tutuldu.
		 */
		this.orderRequest = (OrderRequest) this.getArguments().getSerializable("REQUEST_OBJECT");
		this.foodListResp = (FoodListResp) this.getArguments().getSerializable("RESPONSE_OBJECT");

		/*
		 * Burada yemek listesi ilgili arraylistlere paylaştırılıyor. Böylece
		 * ilgili kategori altında yemeklerin gösterilmesi sağlanıyor.
		 */
		if (this.foodListResp.getFoodList() != null) {
			this.demoMainFoodArray = new ArrayList<FoodDataForm>();
			this.demoSoupArray = new ArrayList<FoodDataForm>();
			this.demoDrinksArray = new ArrayList<FoodDataForm>();
			this.demoDessertsArray = new ArrayList<FoodDataForm>();

			this.demoMainFoodArray.clear();
			this.demoSoupArray.clear();
			this.demoDrinksArray.clear();
			this.demoDessertsArray.clear();

			try {
				for (int i = 0; i < foodListResp.getFoodList().size(); i++) {
					if (foodListResp.getFoodList().get(i).getFoodType() == FoodDataForm.MAIN_FOODS) {
						this.demoMainFoodArray.add(foodListResp.getFoodList().get(i));
					} else if (foodListResp.getFoodList().get(i).getFoodType() == FoodDataForm.SOUPS) {
						this.demoSoupArray.add(foodListResp.getFoodList().get(i));
					} else if (foodListResp.getFoodList().get(i).getFoodType() == FoodDataForm.DRINKS) {
						this.demoDrinksArray.add(foodListResp.getFoodList().get(i));
					} else if (foodListResp.getFoodList().get(i).getFoodType() == FoodDataForm.DESSERTS) {
						this.demoDessertsArray.add(foodListResp.getFoodList().get(i));
					}
				}
			} catch (NullPointerException exception) {
				STSLog.writeLog(exception, this.getClass().getCanonicalName(),"Yemek listesi alınamadığından dolayı hata aldık.");
			}
		}

		/*
		 * Eski siparişler ve sipariş eklemek için gereken yemek menüsü
		 * ekranları arasında geçiş yapabilmek için kullanılan tab yapısını
		 * oluştururlar.
		 */
		this.oldOrdersTabButton = (ButtonBase) this.vi.findViewById(R.id.old_orders_tab_button);
		this.addOrderTabButton = (ButtonBase) this.vi.findViewById(R.id.add_order_tab_button);

		/*
		 * Eski sipariş ve sipariş ekle ekranlarına ait linearlayout nesneleri
		 * oluşturulmuştur. Bu layoutlar tab yapısındaki butonların basılma
		 * durumlarına göre görünür veya görünmez yapılacaktırlar.
		 */
		this.addOrderLinearLayout = (LinearLayoutBase) this.vi.findViewById(R.id.add_order_linearlayout);
		this.oldOrdersLinearlayout = (LinearLayoutBase) this.vi.findViewById(R.id.old_orders_linearlayout);

		oldOrdersTabButton.setSelected(false);
		addOrderTabButton.setSelected(true);

		/*
		 * Tab yapısında eski siparişler butonuna basıldığında yapılacaklar bu
		 * bölümde yer almaktadır.
		 */
		this.oldOrdersTabButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				createOrderedFoodListRequest();
			}

		});

		/*
		 * Tab yapısında sipariş ekle butonuna basıldığında yapılacaklar bu
		 * bölümde yer almaktadır.
		 */
		this.addOrderTabButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				addOrderLinearLayout.setVisibility(View.VISIBLE);
				oldOrdersLinearlayout.setVisibility(View.GONE);
				foodAccountingConfirmButton.setVisibility(View.GONE);
				foodChoosingOkButton.setVisibility(View.VISIBLE);

				oldOrdersTabButton.setSelected(false);
				addOrderTabButton.setSelected(true);
			}
		});

		/*
		 * Eski siparişler ekranının en altında hesap al butonu yer almaktadır.
		 * Bu butona basıldığında hesap alınması için gerekli işlemler
		 * bailatılacaktır.
		 */
		foodAccountingConfirmButton = (ButtonBase) this.vi.findViewById(R.id.food_accounting_confirm_button);
		foodAccountingConfirmButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				createPrintRequest();
			}

		});

		/*
		 * Yemek seçme işlemi tamamlandığında TAMAM butonuna basılarak işlem
		 * bitirilir ve pipeline'da bir sonraki ekrana geçilir.
		 */
		this.foodChoosingOkButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				foodsSelectedList.clear();
				loadSelectedFoodsList(mainFoodSelectedList, foodsSelectedList);
				loadSelectedFoodsList(soupSelectedList, foodsSelectedList);
				loadSelectedFoodsList(drinksSelectedList, foodsSelectedList);
				loadSelectedFoodsList(dessertsSelectedList, foodsSelectedList);

				if (foodsSelectedList.size() != 0) {
					selectedFoodsListAfterAdapter = new FoodListAfterAdapter(getActivity(), R.layout.food_after_selection_item,foodsSelectedList);
					selectedFoodsListView.setAdapter(selectedFoodsListAfterAdapter);

					TreeMap<Long,Integer> orderedFoodList=new TreeMap<Long, Integer>();
					for(int i=0;i<foodsSelectedList.size();i++){
						orderedFoodList.put(foodsSelectedList.get(i).getFoodId(), foodsSelectedList.get(i).getCount());
					}
					orderRequest.setOrderedFoodList(orderedFoodList);

					changeLayoutVisibility(beforeLinearlayout,afterLinearlayout, true);
					foodChoosingOkButton.setVisibility(View.GONE);

					confirmButton.setVisibility(View.VISIBLE);

				} else {
					Toast.makeText(getActivity(),"Yemek seçilmedi. Lütfen yemek menüsünden seçiminizi yapınız.",Toast.LENGTH_LONG).show();
				}
			}
		});

		myRunnable = new Runnable() {
			public void run() {

				oldOrdersTabButton.setSelected(true);
				addOrderTabButton.setSelected(false);

				if (oldOrderedFoodsListAdapter == null) {
					/*
					 * Eski siparişleri gösterebilmek için adapter ve listview
					 * nesneleri oluşturuluyor. Eski sipariş bilgileri
					 * orderRequestObject nesnesinden elde edilip listview'a
					 * veriliyor.
					 */
					oldOrderedFoodsListAdapter = new FoodListOldOrderedAdapter(getActivity(), R.layout.food_after_selection_item,orderedFoodListResp.getOrderedFoodList());
					oldOrderedFoodsListview.setAdapter(oldOrderedFoodsListAdapter);
				} else {
					oldOrderedFoodsListAdapter.notifyDataSetChanged();
				}

				addOrderLinearLayout.setVisibility(View.GONE);
				oldOrdersLinearlayout.setVisibility(View.VISIBLE);
				foodAccountingConfirmButton.setVisibility(View.VISIBLE);
				foodChoosingOkButton.setVisibility(View.GONE);

				totalPrice = 0.00;

				for (int i = 0; i < orderedFoodListResp.getOrderedFoodList().size(); i++) {

					totalPrice = totalPrice+ orderedFoodListResp.getOrderedFoodList().get(i).getPrice();
				}

				totalAccountTextView.setText("Toplam: "+ String.valueOf(totalPrice) + " TL");
			}
		};

		confirmButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {

				if (foodsSelectedList.size() != 0) {
					createRequest();
				} else {
					Toast.makeText(getActivity(),"Sipariş edilecek yemek bulunamadı.Lütfen siparişlerinizi tekrar oluşturunuz.",	Toast.LENGTH_LONG).show();
					backPressed();
				}
			}

		});
		// --------------------------------------------------------------------------------------------------------------

		/*
		 * Ana Yemekler butonuna basıldığı zaman yapılacaklar bu bölümde
		 * belirtilmiştir. Buna göre, bu butona basıldığında yemek seçim ekranı
		 * açılır.
		 */
		this.mainFoodHeaderButton = (ButtonBase) this.vi.findViewById(R.id.main_food_choosing_header_button);
		this.mainFoodHeaderButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				if (demoMainFoodArray != null) {
					FoodSelectingDialogFragment foodSelectingDialogFragment = new FoodSelectingDialogFragment(demoMainFoodArray, FoodDataForm.MAIN_FOODS);
					((FragmentActivityBase) getActivity()).showGeneralDialog(foodSelectingDialogFragment, "FOOD_SELECTING_DIALOG");
				} else {
					Toast.makeText(getActivity(),"Ana yemek listesi alınamadı.Bir önceki ekrana gelip, Tekrar deneyiniz.",Toast.LENGTH_SHORT).show();
				}
			}

		});

		/*
		 * Çorbalar butonuna basıldığı zaman yapılacaklar bu bölümde
		 * belirtilmiştir. Buna göre, bu butona basıldığında yemek seçim ekranı
		 * açılır.
		 */
		this.soupHeaderButton = (ButtonBase) this.vi.findViewById(R.id.soup_choosing_header_button);
		this.soupHeaderButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				if (demoSoupArray != null) {
					FoodSelectingDialogFragment foodSelectingDialogFragment = new FoodSelectingDialogFragment(demoSoupArray, FoodDataForm.SOUPS);
					((FragmentActivityBase) getActivity()).showGeneralDialog(foodSelectingDialogFragment, "FOOD_SELECTING_DIALOG");

				} else {
					Toast.makeText(getActivity(),"Çorba listesi alınamadı.Bir önceki ekrana gelip, Tekrar deneyiniz.",Toast.LENGTH_SHORT).show();
				}
			}

		});

		/*
		 * İçecekler butonuna basıldığı zaman yapılacaklar bu bölümde
		 * belirtilmiştir. Buna göre, bu butona basıldığında yemek seçim ekranı
		 * açılır.
		 */
		this.drinksHeaderButton = (ButtonBase) this.vi.findViewById(R.id.drinks_choosing_header_button);
		this.drinksHeaderButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {

				if (demoDrinksArray != null) {
					FoodSelectingDialogFragment foodSelectingDialogFragment = new FoodSelectingDialogFragment(demoDrinksArray,FoodDataForm.DRINKS);		
					((FragmentActivityBase) getActivity()).showGeneralDialog(foodSelectingDialogFragment, "FOOD_SELECTING_DIALOG");
				} else {
					Toast.makeText(getActivity(),"İçecek listesi alınamadı.Bir önceki ekrana gelip, Tekrar deneyiniz.",Toast.LENGTH_SHORT).show();
				}
			}

		});

		/*
		 * Tatlılar butonuna basıldığı zaman yapılacaklar bu bölümde
		 * belirtilmiştir. Buna göre, bu butona basıldığında yemek seçim ekranı
		 * açılır.
		 */
		this.dessertHeaderButton = (ButtonBase) this.vi.findViewById(R.id.desserts_choosing_header_button);
		this.dessertHeaderButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {

				if (demoDessertsArray != null) {

					FoodSelectingDialogFragment foodSelectingDialogFragment = new FoodSelectingDialogFragment(demoDessertsArray, FoodDataForm.DESSERTS);
					((FragmentActivityBase) getActivity()).showGeneralDialog(foodSelectingDialogFragment, "FOOD_SELECTING_DIALOG");

				} else {
					Toast.makeText(getActivity(),"Tatlı listesi alınamadı.Bir önceki ekrana gelip, Tekrar deneyiniz.",Toast.LENGTH_SHORT).show();
				}
			}
		});

		/*
		 * Yemek seçimi tamamlandığında seçili yemekler selectedFoodListView
		 * içerisinde görüntülenir. Sunucuya seçili yemekleri göndermeden önce
		 * açıldığında belirtilen metod kullanılarak seçili yemeklerin adetlerini
		 * değiştirme yapılabilir.
		 */
		this.selectedFoodsListView.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> parent,View view, int position, long id) {

			OnFoodDetailSelectListener foodDetailSelectListener = new OnFoodDetailSelectListener() {

			@Override
			public void onFoodDetailSelected(FoodDataForm foodDataForm) {

				for (int i = 0; i < foodsSelectedList.size(); i++) {
					if (foodsSelectedList.get(i).getFoodName().equals(foodDataForm.getFoodName())) {
						foodsSelectedList.set(i, foodDataForm);
					}

					if (foodsSelectedList.get(i).getFoodName().equals(foodDataForm.getFoodName())) {
						if (foodDataForm.getCount() != 0) {
							foodsSelectedList.set(i,foodDataForm);
						} else {
							foodsSelectedList.remove(i);
						}
					}

				}
								
				TreeMap<Long,Integer> orderedFoodList=new TreeMap<Long, Integer>();
				for(int i=0;i<foodsSelectedList.size();i++){
					orderedFoodList.put(foodsSelectedList.get(i).getFoodId(), foodsSelectedList.get(i).getCount());
				}
				orderRequest.setOrderedFoodList(orderedFoodList);
				selectedFoodsListAfterAdapter.notifyDataSetChanged();
			}
			};

			ApplicationInfo.setOnFoodDetailSelectedListener(foodDetailSelectListener);
			FoodDetailDialogFragment foodDetailDialogFragment = new FoodDetailDialogFragment((FoodDataForm) foodsSelectedList.get(position));
			((FragmentActivityBase) getActivity()).showGeneralDialog(foodDetailDialogFragment,"ADD_ORDER_STEP_FOOD_DETAIL_DIALOG");
			return false;
		}

		});

		this.roundedProgressDialogBase=new RoundedProgressDialogBase();

		return this.vi;
	}

	/**
	 * Burası seçili yemeklerin sunucuya gönderildiği bölümdür.
	 */
	public void createRequest() {

		((FragmentActivityBase) getActivity()).showGeneralDialog(roundedProgressDialogBase, "ADD_ORDER_STEP_TWO_PROGRESS_DIALOG");

		ApplicationInfo.setResponseListener(this);

		((FragmentActivityBase) getActivity()).createSharedPreferencesManager("sharedpreferences", getActivity());
		ConnectionStatus connectionStatus = (ConnectionStatus) JsonConverter.fromJsonString(((FragmentActivityBase) getActivity()).readFromSharedPreferences("connectionStatus", null),ConnectionStatus.class);

		if (connectionStatus.getConnectionStatusInfo() == ConnectionStatusInfo.CONNECTED) {
			orderRequest.setType("OrderRequest");
			orderRequest.setRequestId(UniqueIdCreator.createUniqueID());

			/*if (orderRequest.getPersonalDataForm() != null) {
				orderRequest.getPersonalDataForm().setPersonelImage(new byte[0]);
			}*/

			ApplicationInfo.getRequestListener().jsonRequestCame(JsonConverter.toJsonString(orderRequest));
		} else {
			Toast.makeText(getActivity(),connectionStatus.getConnectionInfoMessage(),Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * Burası hesap alındığı zaman sunucuya hesap fişinin yazılması isteğini
	 * bildirir.
	 */
	public void createPrintRequest() {
		((FragmentActivityBase) getActivity()).showGeneralDialog(roundedProgressDialogBase, "ADD_ORDER_STEP_TWO_PROGRESS_DIALOG");

		ApplicationInfo.setResponseListener(this);
		PrintReq printReq = new PrintReq();
		printReq.setType("PrintReq");
		printReq.setRequestId(UniqueIdCreator.createUniqueID());
		printReq.setTableId(orderRequest.getTableId());
		ApplicationInfo.getRequestListener().jsonRequestCame(JsonConverter.toJsonString(printReq));
	}

	/**
	 * Bu metod ise daha önceden sipariş edilen yemekleri sunucuya sorduğumuz
	 * bölümdür.
	 */
	public void createOrderedFoodListRequest() {
		((FragmentActivityBase) getActivity()).showGeneralDialog(roundedProgressDialogBase, "ADD_ORDER_STEP_TWO_PROGRESS_DIALOG");

		ApplicationInfo.setResponseListener(this);
		OrderedFoodListReq orderedFoodListReq = new OrderedFoodListReq();
		orderedFoodListReq.setType("OrderedFoodListReq");
		orderedFoodListReq.setRequestId(UniqueIdCreator.createUniqueID());
		orderedFoodListReq.setTableId(orderRequest.getTableId());
		ApplicationInfo.getRequestListener().jsonRequestCame(JsonConverter.toJsonString(orderedFoodListReq));
	}

	/**
	 * 
	 */
	public void onResume() {
		super.onResume();

		ApplicationInfo.setSelectedFoodListener(this);

		((MultiFragmentActivityBase) getActivity()).getPipelineManager().getStepList().get(1).setwFrag(new WeakReference<Fragment>(this));
		((MultiFragmentActivityBase) getActivity()).getPipelineManager().setActiveStep(((MultiFragmentActivityBase) getActivity()).getPipelineManager().getStepList().get(1));
	}

	/**
	 * Uygulamanın ana threadi içerisinde grafiksel güncellemeler yapılmasına
	 * Android tarafından izin verilmediği için bu metoda ihtiyaç duyulmuştur.
	 */
	private void updateGUI() {
		this.myHandler.post(myRunnable);
	}

	/**
	 * Bu metodun geriye döndürdüğü değer false ise bir önceki fragment'a
	 * geçilir. Eğer metodun geri dönüş değeri true ise aynı fragment içindeki
	 * bir önceki duruma (seçim yapılmamış durum) geçilir.
	 */
	public boolean backPressed() {
		if (beforeLinearlayout.getVisibility() == View.VISIBLE) {
			((MultiFragmentActivityBase) getActivity()).removeFragmentFromPipeline(((MultiFragmentActivityBase) getActivity()).getPipelineManager(), this);
			return true;
		} else if (afterLinearlayout.getVisibility() == View.VISIBLE) {
			changeLayoutVisibility(beforeLinearlayout, afterLinearlayout, false);
			foodChoosingOkButton.setVisibility(View.VISIBLE);
			confirmButton.setVisibility(View.GONE);
			return false;
		}
		return false;

	}

	/**
	 * 
	 * @param foodList
	 * @param selectedFoodList
	 */
	public void loadSelectedFoodsList(ArrayList<FoodDataForm> foodList,ArrayList<FoodDataForm> selectedFoodList) {
		for (int i = 0; i < foodList.size(); i++) {
			selectedFoodList.add(foodList.get(i));
		}
	}

	/**
	 * Bu sınıf içerisinde özet ekranında yer alan seçilmiş yemekler listesi
	 * oluşturulur.
	 * 
	 * @author Okan ERDOĞAN 31 May 2014
	 */
	class FoodListAfterAdapter extends ArrayAdapter<FoodDataForm> {

		private Context context;
		private int resourceId;
		private ArrayList<FoodDataForm> arrayList;

		public FoodListAfterAdapter(Context context, int textViewResourceId,ArrayList<FoodDataForm> objects) {
			super(context, textViewResourceId, objects);

			this.context = context;
			this.resourceId = textViewResourceId;

			this.arrayList = objects;
		}

		public View getView(int position, View convertView, ViewGroup parent) {

			try {
				convertView = LayoutInflater.from(this.context).inflate(this.resourceId, null);
				FoodDataForm foodListAfterDataForm = (FoodDataForm) arrayList.get(position);

				TextViewBase selectedFoodName = (TextViewBase) convertView.findViewById(R.id.selected_food_name);
				TextViewBase selectedFoodCount = (TextViewBase) convertView.findViewById(R.id.selected_food_count);
				TextViewBase foodPriceTextview = (TextViewBase) convertView.findViewById(R.id.food_price_textview);

				int count = 0;

				TextViewBase specialty_name1 = (TextViewBase) convertView.findViewById(R.id.specialty_name1);
				TextViewBase specialty_value1 = (TextViewBase) convertView.findViewById(R.id.specialty_value1);

				for (int i = 0; i < foodListAfterDataForm.getSelectablePortions().length; i++) {
					if (foodListAfterDataForm.getSelectablePortions()[i] != null) {
						specialty_name1.setText(foodListAfterDataForm.getSelectablePortions()[i].getName());

						specialty_value1.setText(""+ foodListAfterDataForm.getSelectablePortions()[i].getCount());

						count = count+ foodListAfterDataForm.getSelectablePortions()[i].getCount();
					} else {
						specialty_name1.setVisibility(View.GONE);
						specialty_value1.setVisibility(View.GONE);
					}
				}

				TextViewBase specialty_name2 = (TextViewBase) convertView.findViewById(R.id.specialty_name2);
				TextViewBase specialty_value2 = (TextViewBase) convertView.findViewById(R.id.specialty_value2);
				specialty_name2.setVisibility(View.GONE);
				specialty_value2.setVisibility(View.GONE);

				TextViewBase specialty_name3 = (TextViewBase) convertView.findViewById(R.id.specialty_name3);
				TextViewBase specialty_value3 = (TextViewBase) convertView.findViewById(R.id.specialty_value3);
				specialty_name3.setVisibility(View.GONE);
				specialty_value3.setVisibility(View.GONE);

				selectedFoodName.setText(foodListAfterDataForm.getFoodName());

				selectedFoodCount.setText("" + count);

				foodPriceTextview.setText("Fiyat: "+ String.valueOf(count* foodListAfterDataForm.getPrice()) + " TL");

			} catch (InflateException e) {
				STSLog.writeLog(e, this.getClass().getCanonicalName(),
						"Verilen layout dosyasından view elde edilirken hata alındı.");
			}
			return convertView;
		}

	}

	/**
	 * Bu sınıf, daha önceden sipariş edilmiş yemeklerin listeye yerleştirilmesi
	 * esnasında kullanılan adapter sınıfıdır.
	 * 
	 * @author Okan ERDOĞAN
	 * 
	 * 30 Ağu 2014
	 */
	class FoodListOldOrderedAdapter extends ArrayAdapter<FoodDataForm> {

		private Context context;
		private int resourceId;
		private ArrayList<FoodDataForm> arrayList;

		public FoodListOldOrderedAdapter(Context context,int textViewResourceId, ArrayList<FoodDataForm> objects) {
			super(context, textViewResourceId, objects);

			this.context = context;
			this.resourceId = textViewResourceId;

			this.arrayList = objects;
		}

		public View getView(int position, View convertView, ViewGroup parent) {

			convertView = LayoutInflater.from(this.context).inflate(this.resourceId, null);

			FoodDataForm foodListAfterDataForm = (FoodDataForm) arrayList.get(position);

			TextViewBase selectedFoodName = (TextViewBase) convertView.findViewById(R.id.selected_food_name);
			TextViewBase selectedFoodCount = (TextViewBase) convertView.findViewById(R.id.selected_food_count);
			TextViewBase foodPriceTextview = (TextViewBase) convertView.findViewById(R.id.food_price_textview);

			int count = 0;

			TextViewBase specialty_name1 = (TextViewBase) convertView.findViewById(R.id.specialty_name1);
			TextViewBase specialty_value1 = (TextViewBase) convertView.findViewById(R.id.specialty_value1);
			specialty_name1.setVisibility(View.GONE);
			specialty_value1.setVisibility(View.GONE);

			/*for (int i = 0; i < foodListAfterDataForm.getSelectablePortions().length; i++) {
				if (foodListAfterDataForm.getSelectablePortions()[i] != null) {
					specialty_name1.setText(foodListAfterDataForm.getSelectablePortions()[i].getName());

					specialty_value1.setText(""+ foodListAfterDataForm.getSelectablePortions()[i].getCount());

					count = foodListAfterDataForm.getSelectablePortions()[i].getCount();
				} else {
					specialty_name1.setVisibility(View.GONE);
					specialty_value1.setVisibility(View.GONE);
				}
			}*/

			TextViewBase specialty_name2 = (TextViewBase) convertView.findViewById(R.id.specialty_name2);
			TextViewBase specialty_value2 = (TextViewBase) convertView.findViewById(R.id.specialty_value2);
			specialty_name2.setVisibility(View.GONE);
			specialty_value2.setVisibility(View.GONE);

			TextViewBase specialty_name3 = (TextViewBase) convertView.findViewById(R.id.specialty_name3);
			TextViewBase specialty_value3 = (TextViewBase) convertView.findViewById(R.id.specialty_value3);
			specialty_name3.setVisibility(View.GONE);
			specialty_value3.setVisibility(View.GONE);

			selectedFoodName.setText(foodListAfterDataForm.getFoodName());

			selectedFoodCount.setText("" + foodListAfterDataForm.getCount());

			foodPriceTextview.setText("Fiyat: "+ String.valueOf(foodListAfterDataForm.getPrice())+ " TL");

			return convertView;
		}

		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
			if (orderedFoodListResp != null) {
				arrayList.clear();
				if (orderedFoodListResp.getOrderedFoodList() != null) {
					arrayList.addAll(orderedFoodListResp.getOrderedFoodList());
				}
			}
		}

	}

	/**
	 * Bu sınıf, yemek seçimlerini dinler. Bu metod ise seçili yemek listesinin
	 * kategorisiyle beraber elde edildiği bölümdür.
	 */
	@Override
	public void foodSelected(ArrayList<FoodDataForm> selectedFoodList,int foodCategorie) {

		if (foodCategorie == FoodDataForm.MAIN_FOODS) {
			this.mainFoodSelectedList = selectedFoodList;

			/*
			 * Eğer ana yemek listesinin eleman sayısı 0 ise yemek listesi ilk
			 * durumuna gönderiliyor.
			 */
			if (mainFoodSelectedList.size() <= 0 && demoMainFoodArray != null) {
				for (int i = 0; i < demoMainFoodArray.size(); i++) {
					for (int j = 0; j < demoMainFoodArray.get(i).getSelectablePortions().length; j++) {
						if (demoMainFoodArray.get(i).getSelectablePortions()[j] != null) {
							demoMainFoodArray.get(i).getSelectablePortions()[j].setCount(0);
							demoMainFoodArray.get(i).setSelected(false);
						}
					}
				}
			}

			/*
			 * Eğer ana yemek listesinin eleman sayısı sıfırdan farklı ise,
			 * yemek seçim ekranına yemek listesine yemek bilgileri
			 * gönderilirken Seçimi yapılan porsiyon bilgileriyle gönderiliyor.
			 */
			if (demoMainFoodArray != null) {
				for (int i = 0; i < mainFoodSelectedList.size(); i++) {
					for (int j = 0; j < demoMainFoodArray.size(); j++) {
						if (mainFoodSelectedList.get(i).getFoodName().equals(demoMainFoodArray.get(j).getFoodName())) {
							demoMainFoodArray.set(j,mainFoodSelectedList.get(i));
						}
					}

				}
			}

		} else if (foodCategorie == FoodDataForm.SOUPS) {
			this.soupSelectedList = selectedFoodList;

			/*
			 * Eğer çorba listesinin eleman sayısı 0 ise yemek listesi ilk
			 * durumuna gönderiliyor.
			 */
			if (soupSelectedList.size() <= 00 && demoSoupArray != null) {
				for (int i = 0; i < demoSoupArray.size(); i++) {
					for (int j = 0; j < demoSoupArray.get(i).getSelectablePortions().length; j++) {
						if (demoSoupArray.get(i).getSelectablePortions()[j] != null) {
							demoSoupArray.get(i).getSelectablePortions()[j].setCount(0);
							demoSoupArray.get(i).setSelected(false);
						}

					}
				}
			}

			/*
			 * Eğer çorba listesinin eleman sayısı sıfırdan farklı ise, yemek
			 * seçim ekranına yemek listesine yemek bilgileri gönderilirken
			 * Seçimi yapılan porsiyon bilgileriyle gönderiliyor.
			 */
			if (demoSoupArray != null) {
				for (int i = 0; i < soupSelectedList.size(); i++) {
					for (int j = 0; j < demoSoupArray.size(); j++) {
						if (soupSelectedList.get(i).getFoodName().equals(demoSoupArray.get(j).getFoodName())) {
							demoSoupArray.set(j, soupSelectedList.get(i));
						}
					}

				}
			}

		} else if (foodCategorie == FoodDataForm.DRINKS) {
			this.drinksSelectedList = selectedFoodList;

			/*
			 * Eğer içecek listesinin eleman sayısı 0 ise yemek listesi ilk
			 * durumuna gönderiliyor.
			 */
			if (drinksSelectedList.size() <= 0 && demoDrinksArray != null) {
				for (int i = 0; i < demoDrinksArray.size(); i++) {
					for (int j = 0; j < demoDrinksArray.get(i).getSelectablePortions().length; j++) {
						if (demoDrinksArray.get(i).getSelectablePortions()[j] != null) {
							demoDrinksArray.get(i).getSelectablePortions()[j].setCount(0);
							demoDrinksArray.get(i).setSelected(false);
						}

					}
				}
			}

			/*
			 * Eğer içecek listesinin eleman sayısı sıfırdan farklı ise, yemek
			 * seçim ekranına yemek listesine yemek bilgileri gönderilirken
			 * Seçimi yapılan porsiyon bilgileriyle gönderiliyor.
			 */
			if (demoDrinksArray != null) {
				for (int i = 0; i < drinksSelectedList.size(); i++) {
					for (int j = 0; j < demoDrinksArray.size(); j++) {
						if (drinksSelectedList.get(i).getFoodName().equals(demoDrinksArray.get(j).getFoodName())) {
							demoDrinksArray.set(j, drinksSelectedList.get(i));
						}
					}

				}
			}

		} else if (foodCategorie == FoodDataForm.DESSERTS) {
			this.dessertsSelectedList = selectedFoodList;

			/*
			 * Eğer tatlı listesinin eleman sayısı 0 ise yemek listesi ilk
			 * durumuna gönderiliyor.
			 */
			if (dessertsSelectedList.size() <= 0 && demoDessertsArray != null) {
				for (int i = 0; i < demoDessertsArray.size(); i++) {
					for (int j = 0; j < demoDessertsArray.get(i).getSelectablePortions().length; j++) {
						if (demoDessertsArray.get(i).getSelectablePortions()[j] != null) {
							demoDessertsArray.get(i).getSelectablePortions()[j].setCount(0);
							demoDessertsArray.get(i).setSelected(false);
						}
					}
				}
			}

			/*
			 * Eğer tatlı listesinin eleman sayısı sıfırdan farklı ise, yemek
			 * seçim ekranına yemek listesine yemek bilgileri gönderilirken
			 * Seçimi yapılan porsiyon bilgileriyle gönderiliyor.
			 */
			if (demoDessertsArray != null) {
				for (int i = 0; i < dessertsSelectedList.size(); i++) {
					for (int j = 0; j < demoDessertsArray.size(); j++) {
						if (dessertsSelectedList.get(i).getFoodName().equals(demoDessertsArray.get(j).getFoodName())) {
							demoDessertsArray.set(j,dessertsSelectedList.get(i));
						}
					}

				}
			}

		}
	}

	/**
	 * Sunucudan bir cevap geldiği zaman bu metod tetiklenir.
	 */
	@Override
	public void responseCame(String response) {
		JSONResponse responseObject = (JSONResponse) JsonConverter.fromJsonString(response, JSONResponse.class);

		if (responseObject.getType().equals("OrderResponse")) {
			OrderResponse orderResponse = (OrderResponse) JsonConverter.fromJsonString(response, OrderResponse.class);

			if (orderResponse.isOrderResult()) {
				Intent orderIntent = new Intent(getActivity(),MenuOptionsActivity.class);
				OneButtonDialogFragmentBase oneButtonDialogFragmentBase=new OneButtonDialogFragmentBase("İşlem Başarılı",orderIntent);
				((FragmentActivityBase) getActivity()).showGeneralDialog(oneButtonDialogFragmentBase, "ADD_ORDER_STEP_TWO_PROCESS_COMPLETED_DIALOG");
			} else {
				OneButtonDialogFragmentBase oneButtonDialogFragmentBase=new OneButtonDialogFragmentBase("İşleminiz başarısız oldu.Mutfak tabletlerinde sorun olabilir.");
				((FragmentActivityBase) getActivity()).showGeneralDialog(oneButtonDialogFragmentBase, "ADD_ORDER_STEP_TWO_PROCESS_NOT_COMPLETED_DIALOG");
			}
		
		} else if (responseObject.getType().equals("OrderedFoodListResp")) {
			this.orderedFoodListResp = (OrderedFoodListResp) JsonConverter.fromJsonString(response, OrderedFoodListResp.class);
			updateGUI();
		} else if (responseObject.getType().equals("PrintResp")) {
			this.printResp = (PrintResp) JsonConverter.fromJsonString(response,PrintResp.class);
			if (printResp.isPrintSuccess()) {
				Intent orderIntent = new Intent(getActivity(),MenuOptionsActivity.class);
				OneButtonDialogFragmentBase oneButtonDialogFragmentBase=new OneButtonDialogFragmentBase("İşlem Başarılı",orderIntent);
				((FragmentActivityBase) getActivity()).showGeneralDialog(oneButtonDialogFragmentBase, "ADD_ORDER_STEP_TWO_PRINTER_PROCESS_COMPLETED_DIALOG");
			} else {
				OneButtonDialogFragmentBase oneButtonDialogFragmentBase=new OneButtonDialogFragmentBase("İşleminiz başarısız oldu.Yazıcıda sorun olabilir.");
				((FragmentActivityBase) getActivity()).showGeneralDialog(oneButtonDialogFragmentBase, "ADD_ORDER_STEP_TWO_PRINTER_PROCESS_NOT_COMPLETED_DIALOG");
			}
		}
		
		if ((FragmentActivityBase) getActivity() != null) {
			((FragmentActivityBase) getActivity()).closeGeneralDialog(roundedProgressDialogBase, "ADD_ORDER_STEP_TWO_PROGRESS_DIALOG");
		}

	}

}
